//
// Created by 29245 on 2025/8/26.
//

#ifndef ZHIZHU_PCA9685_H
#define ZHIZHU_PCA9685_H

#include "stm32f1xx.h"
#include "stdint.h"

// PCA9685 I2C地址 (可根据实际硬件连接调整)
#define PCA_Addr        0x80    // 7位地址左移1位，实际地址为0x40

// PCA9685寄存器地址定义
#define PCA_Model       0x00    // MODE1寄存器地址
#define PCA_Pre         0xFE    // 预分频寄存器地址
#define LED0_ON_L       0x06    // LED0 ON寄存器低字节地址

// GPIO端口和引脚定义 (如果使用软件I2C才需要)
#define PORT_SCL        GPIOB
#define PORT_SDA        GPIOB
#define GPIO_SCL        GPIO_PIN_6
#define GPIO_SDA        GPIO_PIN_7

// RCU时钟定义 (如果使用软件I2C才需要)
#define RCU_SCL         RCU_GPIOB
#define RCU_SDA         RCU_GPIOB

// 如果使用硬件I2C，需要定义I2C端口时钟 (根据实际使用的I2C接口修改)
#define RCU_I2C_PORT    RCU_I2C1

// GPIO控制宏定义 (软件I2C使用)
#define SDA_IN()        gpio_mode_set(PORT_SDA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_SDA)
#define SDA_OUT()       gpio_mode_set(PORT_SDA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_SDA)
#define SCL(x)          (x)? gpio_bit_set(PORT_SCL, GPIO_SCL) : gpio_bit_reset(PORT_SCL, GPIO_SCL)
#define SDA(x)          (x)? gpio_bit_set(PORT_SDA, GPIO_SDA) : gpio_bit_reset(PORT_SDA, GPIO_SDA)
#define SDA_GET()       gpio_input_bit_get(PORT_SDA, GPIO_SDA)

// 函数声明
void PCA9685_GPIO_Init(void);
void PCA9685_Write(uint8_t addr, uint8_t data);
uint8_t PCA9685_Read(uint8_t addr);
void PCA9685_setPWM(uint8_t num, uint32_t on, uint32_t off);
void PCA9685_setFreq(float freq);
void setAngle(uint8_t num, uint8_t angle);
void PCA9685_Init(float hz, uint8_t angle);

#endif //ZHIZHU_PCA9685_H